module sram_crossbar #(
    parameter DATA_WIDTH = 8,
    parameter SRAM_ADDR_WIDTH = 10,
    parameter NUM_SRAM = 64
) (
    input  wire         clk,
    input  wire         rst_n,
    input  wire         cs,
    input  wire         wen,
    input  wire [SRAM_ADDR_WIDTH+$clog2(NUM_SRAM)-1:0] addr,  // Full address
    input  wire [DATA_WIDTH-1:0] wdata,
    output wire [DATA_WIDTH-1:0] rdata,

    // AXI 接口信号
    input               awvalid,
    output wire         awready,
    input               wvalid,
    output wire         wready,
    output wire [1:0]   bresp,
    output wire         bvalid,
    input               bready
);

    // 地址参数
    localparam BANK_SEL_WIDTH = $clog2(NUM_SRAM);

    // 控制器输出信号
    wire [BANK_SEL_WIDTH-1:0] bank_sel;        // 目标SRAM编号 (0~63)
    wire [SRAM_ADDR_WIDTH-1:0] sram_addr;      // SRAM内部地址
    wire [NUM_SRAM-1:0] sram_cs;               // One-hot片选信号
    wire [NUM_SRAM-1:0] sram_wen;              // One-hot写使能
    wire [DATA_WIDTH-1:0] sram_din;            // 写入数据

    // SRAM读数据总线
    wire [DATA_WIDTH-1:0] sram_rdata [NUM_SRAM-1:0];

    // AXI控制器实例
    axi_sram_controller #(
        .DATA_WIDTH(DATA_WIDTH),
        .ADDR_WIDTH(SRAM_ADDR_WIDTH + BANK_SEL_WIDTH)
    ) controller_inst (
        .clk(clk),
        .rst_n(rst_n),
        // AXI写地址通道
        .awaddr(addr),
        .awvalid(awvalid),
        .awready(awready),
        // AXI写数据通道
        .wdata(wdata),
        .wvalid(wvalid),
        .wready(wready),
        // AXI写响应通道
        .bresp(bresp),
        .bvalid(bvalid),
        .bready(bready),
        // SRAM控制信号
        .sram_cs(sram_cs),           // 输出One-hot片选
        .sram_wen(sram_wen),         // 输出One-hot写使能
        .sram_addr(sram_addr),  // SRAM内部地址
        .sram_din(sram_din),    // 写入数据
        .bank_sel(bank_sel)     // 目标SRAM编号
    );

    // 实例化64个SRAM Bank
    generate
        genvar i;
        for (i = 0; i < NUM_SRAM; i = i + 1) begin : SRAM_BANK
            sram #(
                .DATA_WIDTH(DATA_WIDTH),
                .ADDR_WIDTH(SRAM_ADDR_WIDTH),
                .DEPTH(2**SRAM_ADDR_WIDTH)
            ) sram_inst (
                .clk(clk),
                .cs(sram_cs[i]),    // 片选由控制器One-hot信号控制
                .wen(sram_wen[i]),  // 写使能由控制器One-hot信号控制
                .addr(sram_addr),
                .wdata(sram_din),
                .rdata(sram_rdata[i])
            );
        end
    endgenerate

    // 输出数据选择：根据bank_sel选中对应SRAM的读数据
    assign rdata = sram_rdata[bank_sel];

endmodule